package com.tanhua.sso.service;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.tanhua.common.enums.SexEnum;
import com.tanhua.common.exception.BusinessException;
import com.tanhua.common.mapper.UserInfoMapper;
import com.tanhua.common.pojo.User;
import com.tanhua.common.pojo.UserInfo;
import com.tanhua.common.vo.ErrorResult;
import com.tanhua.enums.FileTypeEnum;
import com.tanhua.face.FaceTemplate;
import com.tanhua.oss.OssTemplate;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 *
 * @ClassName: UserInfoService
 * @Author:王晨晗
 * @Description:
 * @Date: 2021/12/27/10:09
 */
@Service
@Slf4j
public class UserInfoService {

    @Autowired
    public UserService userService;

    @Autowired
    private OssTemplate ossTemplate;

    @Autowired
    private FaceTemplate faceTemplate;

    @Autowired
    public UserInfoMapper userInfoMapper;

    /**
     * @description 保存用户详细信息
     * @param token 用户令牌
     * @param params 用户详细信息集合
     * @return
     */
    public void saveUserInfo(String token, Map<String, String> params) {
        //1.解析token
        User user = userService.queryToken(token);
        //保存用户信息
        UserInfo userInfo = new UserInfo();
        userInfo.setUserId(user.getId());           //用户id
        userInfo.setBirthday(params.get("birthday"));   //出生日期
        userInfo.setSex(StringUtils.equalsIgnoreCase(params.get("gender") , "man") ? SexEnum.MAN : SexEnum.WOMAN);      //性别
        userInfo.setNickName(params.get("nickname"));           //昵称
        userInfo.setCity(params.get("city"));       //城市
        //执行插入操作
        int insert = userInfoMapper.insert(userInfo);
        //判断数据添加数据库是否成功;
        if (insert == 0){
            //保存失败,抛出保存用户信息失败异常;
            throw new BusinessException(ErrorResult.saveUserInfoError());
        }
    }

    /**
     * @description 头像上传
     * @param token 用户令牌
     * @param uploadFile   上传文件
     * @return
     */
    public void uploadFile(String token, MultipartFile uploadFile) {
        //校验token , 获取用户信息;
        User user = userService.queryToken(token);

        //校验文件是否是图片
        boolean isPic = ossTemplate.fileFormat(uploadFile.getOriginalFilename(), FileTypeEnum.PIC);
        //如果不是图片,响应错误信息;
        if (!isPic){
            throw new BusinessException(ErrorResult.fileFormatError());     //文件格式异常;
        }
        //图片格式校验通过, 进行人脸识别
        boolean flag = false;       //标识
        String filePath = null;     //图片上传路径;
        try {
            //调用人脸识别模板类 , 进行人脸识别 , 获取返回结果;
            flag = faceTemplate.checkIsPortrait(uploadFile.getBytes());
            //filePath = ossTemplate.uploadFile(uploadFile , FileTypeEnum.PIC);   //未校验格式,可调用此方法
        }/*catch (FileFormatExecption e){
            throw new BusinessException(ErrorResult.fileFormatError());
        }*/ catch (Exception e) {
            throw new BusinessException(ErrorResult.faceError());   //人脸识别异常;
        }
        //判断人脸识别是否失败;
        if (!flag){
            throw new BusinessException(ErrorResult.faceError());       //人脸识别失败异常;
        }
        //人脸识别通过,进行文件上传 , 获取文件url路径地址;
        filePath = ossTemplate.uploadFile(uploadFile);      //校验过格式 直接上传即可
        //如果地址为空 , 表示上传失败
        if (filePath == null){
            throw new BusinessException(ErrorResult.uploadFileError());     //抛出文件上传异常;
        }
        //创建用户详细信息对象 , 进行数据封装
        UserInfo userInfo = new UserInfo();
        userInfo.setLogo(filePath);     //头像
        //创建修改对象
        LambdaUpdateWrapper<UserInfo> query = new LambdaUpdateWrapper<>();
        //构建修改条件
        query.eq(UserInfo::getUserId , user.getId());
        //执行修改操作,返回修改结果
        int update = userInfoMapper.update(userInfo, query);
        //如果修改数为0,表示修改失败
        if (update == 0){
            throw new BusinessException(ErrorResult.UserPicError());        //抛出用户头像上传失败异常;
        }
    }
}
